home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -seriously_amiga- / programming / other / cyberxxxsrc / cyberqt / txt / cyberqt.mod next >
Text File  |  1999-02-08  |  12KB  |  425 lines

  1. MODULE  CyberQT;
  2.  
  3. (* $IFNOT DEBUG *)
  4.   (* $StackChk- $OvflChk- $RangeChk- $CaseChk- $ReturnChk- $NilChk- $TypeChk- $OddChk- $ClearVars- *)
  5. (* $END *)
  6.  
  7. (* /// ------------------------------- "IMPORT" -------------------------------- *)
  8. IMPORT  a:=CyberQTAudio,
  9.         asl:=ASL,
  10.         as:=ASLSupport,
  11.         cu:=CyberQTUtils,
  12.         d:=Dos,
  13.         ds:=DosSupport,
  14.         e:=Exec,
  15.         es:=ExecSupport,
  16.         g:=CyberQTGlobals,
  17.         i:=CyberQTIndex,
  18.         i2m:=Intel2Mot,
  19.         ic:=Icon,
  20.         io:=AsyncIOSupport2,
  21.         o:=CyberQTOpts,
  22.         ol:=OberonLib,
  23.         p:=CyberQTParser,
  24.         sl:=StringLib,
  25.         u:=Utility,
  26. (* /// "$IF DEBUG" *)
  27.         NoGuru,
  28.         Break,
  29. (* \\\ $END *)
  30.         v:=CyberQTVideo,
  31.         wb:=Workbench,
  32.         y:=SYSTEM;
  33. (* \\\ ------------------------------------------------------------------------- *)
  34.  
  35. (* /// -------------------------------- "CONST" -------------------------------- *)
  36. CONST
  37. (* $IF RUNDEBUG *)
  38.         template="FILES/M,"
  39.  
  40.                  "PUBSCREEN/K,"
  41.                  "SCREENMODEREQ=SMR/S,"
  42.                  "SCREENMODEID=SMID/K,"
  43.  
  44.                  "FORCE24/S,"
  45.                  "GRAY=GREY/S,"
  46.                  "AGA/S,"
  47.                  "HAM8/S,"
  48.                  "DITHER/S,"
  49.                  "CMAP/K,"
  50.  
  51.                  "BUFFERSIZE=BUF/K/N,"
  52.                  "DELAY/K/N,"
  53.  
  54.                  "LOOP/S,"
  55.                  "MAXFPS/S,"
  56.                  "NOSOUND/S,"
  57.                  "NOVIDEO/S,"
  58.                  "SKIP/S,"
  59.                  "AUDIOPRELOAD=APL/S,"
  60.                  "MAGNIFY/K/N,"
  61.  
  62.                  "STATS/S,"
  63.                  "QUIET/S"
  64.  
  65.                  ",DEBUG/S";
  66. (* $ELSE *)
  67.         template="FILES/M,"
  68.  
  69.                  "PUBSCREEN/K,"
  70.                  "SCREENMODEREQ=SMR/S,"
  71.                  "SCREENMODEID=SMID/K,"
  72.  
  73.                  "FORCE24/S,"
  74.                  "GRAY=GREY/S,"
  75.                  "AGA/S,"
  76.                  "HAM8/S,"
  77.                  "DITHER/S,"
  78.                  "CMAP/K,"
  79.  
  80.                  "BUFFERSIZE=BUF/K/N,"
  81.                  "DELAY/K/N,"
  82.  
  83.                  "LOOP/S,"
  84.                  "MAXFPS/S,"
  85.                  "NOSOUND/S,"
  86.                  "NOVIDEO/S,"
  87.                  "SKIP/S,"
  88.                  "AUDIOPRELOAD=APL/S,"
  89.                  "MAGNIFY/K/N,"
  90.  
  91.                  "STATS/S,"
  92.                  "QUIET/S"
  93.  
  94.                  "";
  95. (* $END *)
  96.  
  97. (* $IF BETA *)
  98.         version="$VER: CyberQT 1.4 beta 0, time limit is 30-Nov-97 (2.10.97)"
  99.                 "\oCyberQT is ©1996-1997 Thore Böckelmann";
  100.         expireDate=7274; (* = 30.11.97 *)
  101. (* $ELSE *)
  102.         version="$VER: CyberQT 1.4 (20.1.98)"
  103.                 "\oCyberQT is ©1996-1997 Thore Böckelmann";
  104. (* $END *)
  105.  
  106.         idfree=y.VAL(LONGINT,"free");
  107.         idmdat=y.VAL(LONGINT,"mdat");
  108.         idmoov=y.VAL(LONGINT,"moov");
  109.         idpnot=y.VAL(LONGINT,"pnot");
  110.         idskip=y.VAL(LONGINT,"skip");
  111. (* \\\ ------------------------------------------------------------------------- *)
  112.  
  113. (* /// --------------------------------- "VAR" --------------------------------- *)
  114. VAR     fileReq: asl.FileRequesterPtr;
  115. (* /// "$IF BETA" *)
  116.         now: d.Date;
  117.         expire: d.Date;
  118. (* \\\ $END *)
  119. (* \\\ ------------------------------------------------------------------------- *)
  120.  
  121. (* /// -------------------------- "PROCEDURE IsQT()" --------------------------- *)
  122. PROCEDURE IsQT(total: LONGINT): BOOLEAN;
  123.  
  124. VAR     pos: LONGINT;
  125.         len: LONGINT;
  126.         cid: LONGINT;
  127.         d1: LONGINT;
  128.         d2: LONGINT;
  129.  
  130. BEGIN
  131.   len:=io.GetMSBLong(g.qtFile);
  132.   pos:=len;
  133.   cid:=io.GetMSBLong(g.qtFile);
  134.   IF cid=idmdat THEN
  135.     io.SeekTo(g.qtFile,0);
  136.     IF len=0 THEN
  137.       RETURN FALSE;
  138.     ELSE
  139.       RETURN (len<total);
  140.     END;
  141.   ELSIF cid=idmoov THEN
  142.     io.SeekTo(g.qtFile,0);
  143.     RETURN TRUE;
  144.   END;
  145.   IF len<4 THEN RETURN FALSE; END;
  146.   WHILE pos<total DO
  147.     io.SeekTo(g.qtFile,pos);
  148.     len:=io.GetMSBLong(g.qtFile);
  149.     IF len=0 THEN
  150.       len:=io.GetMSBLong(g.qtFile);
  151.       INC(pos,4);
  152.     END;
  153.     d1:=io.GetMSBLong(g.qtFile);
  154.     d2:=io.GetMSBLong(g.qtFile);
  155.     IF d1=idmoov THEN
  156.       io.SeekTo(g.qtFile,pos);
  157.       RETURN TRUE;
  158.     END;
  159.     INC(pos,4);
  160.     IF d2=idmoov THEN
  161.       io.SeekTo(g.qtFile,pos);
  162.       RETURN TRUE;
  163.     END;
  164.     IF len=0 THEN RETURN FALSE; END;
  165.   END;
  166.   RETURN FALSE;
  167. END IsQT;
  168. (* \\\ ------------------------------------------------------------------------- *)
  169.  
  170. (* /// ---------------------- "PROCEDURE TestRSRCFork()" ----------------------- *)
  171. PROCEDURE TestRSRCFork(file: ARRAY OF CHAR): BOOLEAN; (* $CopyArrays- *)
  172.  
  173. VAR     rsrc: e.STRING;
  174.  
  175. BEGIN
  176. (* /// "$IF RUNDEBUG" *)
  177.   IF o.debug THEN d.PrintF("just .data fork, trying .rsrc fork\n"); END;
  178. (* \\\ $END *)
  179.   sl.sprintf(rsrc,".resource/%s",y.ADR(file));
  180.   IF io.Open(g.qtFile,rsrc,o.bufferSize,FALSE) THEN
  181.     RETURN IsQT(io.FileSize(g.qtFile));
  182.   ELSE
  183.     sl.sprintf(rsrc,"resource/%s",y.ADR(file));
  184.     IF io.Open(g.qtFile,rsrc,o.bufferSize,FALSE) THEN
  185.       RETURN IsQT(io.FileSize(g.qtFile));
  186.     ELSE
  187.       sl.sprintf(rsrc,"%s.rsrc",y.ADR(file));
  188.       IF io.Open(g.qtFile,rsrc,o.bufferSize,FALSE) THEN
  189.         RETURN IsQT(io.FileSize(g.qtFile));
  190.       ELSE
  191.         sl.sprintf(rsrc,"%s.rs",y.ADR(file));
  192.         IF io.Open(g.qtFile,rsrc,o.bufferSize,FALSE) THEN
  193.           RETURN IsQT(io.FileSize(g.qtFile));
  194.         ELSE
  195.           d.PrintF("File \"%s\" is just the .data fork, .rsrc fork is missing.\n"
  196.                    "Neither \".resource/%s\" nor \"resource/%s\" nor \"%s.rsrc\" nor \"%s.rs\" do exist.\n",y.ADR(file),y.ADR(file),y.ADR(file),y.ADR(file),y.ADR(file));
  197.           RETURN FALSE;
  198.         END;
  199.       END;
  200.     END;
  201.   END;
  202. END TestRSRCFork;
  203. (* \\\ ------------------------------------------------------------------------- *)
  204.  
  205. (* /// ------------------------- "PROCEDURE ParseQT()" ------------------------- *)
  206. PROCEDURE ParseQT(ap: d.AnchorPathPtr;
  207.                   multi: BOOLEAN): LONGINT;
  208.  
  209. VAR     atom: g.Atom;
  210.         errVal: LONGINT;
  211.         moovParsed: BOOLEAN;
  212.         size: LONGINT;
  213.         rsrcNeeded: BOOLEAN;
  214.         fileNamePtr: e.STRPTR;
  215.  
  216. BEGIN
  217.   NEW(fileNamePtr);
  218.   COPY(ap.info.fileName,fileNamePtr^);
  219.   IF multi & ~o.quiet THEN
  220.     d.PrintF("%s: ",y.ADR(ap.info.fileName));
  221.     y.SETREG(0,d.Flush(d.Output()));
  222.   END;
  223.  
  224.   IF ~io.Open(g.qtFile,ap.info.fileName,o.bufferSize,FALSE) THEN RETURN d.IoErr(); END;
  225.   size:=ap.info.size;
  226.   errVal:=g.noError;
  227.   moovParsed:=FALSE;
  228.   rsrcNeeded:=FALSE;
  229.  
  230.   IF ~o.quiet & multi THEN d.PrintF("\n"); END;
  231.  
  232.   IF ~IsQT(size) THEN
  233.     IF ~TestRSRCFork(ap.info.fileName) THEN
  234.       RETURN d.objectWrongType;
  235.     ELSE
  236.       rsrcNeeded:=TRUE;
  237.       size:=io.FileSize(g.qtFile)-io.FilePos(g.qtFile); (* verbleibende Größe neu ausrechnen, hat sich bei IsQT() geändert! *)
  238.     END;
  239.   END;
  240.  
  241.   WHILE ~moovParsed & (size>0) & (errVal=g.noError) DO
  242.     io.Read(g.qtFile,y.ADR(atom),SIZE(atom));
  243.     DEC(size,atom.size);
  244.     DEC(atom.size,SIZE(atom));
  245. (* /// "$IF RUNDEBUG" *)
  246.       IF o.debug THEN
  247.         d.PrintF("id: "); cu.PrintFCC(atom.id); d.PrintF(", size: %ld\n\n",atom.size);
  248.       END;
  249. (* \\\ $END *)
  250.     CASE atom.id OF
  251.     | idmoov:
  252.         errVal:=p.ParseMOOV(atom.size);
  253.         moovParsed:=(errVal=g.noError);
  254.     | idmdat,
  255.       idskip,
  256.       idfree,
  257.       idpnot: io.Skip(g.qtFile,atom.size);
  258.     ELSE
  259. (* /// "$IF RUNDEBUG" *)
  260.         IF o.debug THEN d.PrintF("unknown atom\n"); END;
  261. (* \\\ $END *)
  262.       io.Skip(g.qtFile,atom.size);
  263.     END;
  264.  
  265.     IF d.ctrlC IN e.SetSignal(LONGSET{},LONGSET{d.ctrlC}) THEN errVal:=d.break; END;
  266.     IF ~g.qtFile.readOk THEN errVal:=g.readError; END;
  267.   END;
  268.  
  269.   IF moovParsed THEN
  270. (*
  271.     IF rsrcNeeded THEN
  272.       IF ~io.Open(g.qtFile,ap.info.fileName,o.bufferSize,FALSE) THEN RETURN d.IoErr(); END;
  273.     ELSE
  274.       io.SeekTo(g.qtFile,0); (* sonst wieder an den Anfang seek()en *)
  275.     END;
  276. *)
  277.     io.Close(g.qtFile);
  278.     IF a.InitAudioFile(ap.info.fileName) & v.InitVideoFile(ap.info.fileName) THEN
  279.       i.BuildIndices();
  280.       errVal:=i.Playback(fileNamePtr);
  281.     END;
  282.   END;
  283.   cu.DisposeTrack(g.animInfo.videoTracks);
  284.   cu.DisposeTrack(g.animInfo.audioTracks);
  285.  
  286.   IF errVal#g.noError THEN
  287.     IF errVal=g.skipAnim THEN
  288.       errVal:=g.noError;
  289.     ELSE
  290.       CASE errVal OF
  291.       | g.unknownError,
  292.         g.readError: errVal:=d.seekError;
  293.       | d.break:
  294.       ELSE
  295.         errVal:=d.IoErr();
  296.       END;
  297.     END;
  298. (* /// "$IF RUNDEBUG" *)
  299.     IF o.debug THEN d.PrintF("errVal=%ld\n",errVal); END;
  300. (* \\\ $END *)
  301.   END;
  302.   DISPOSE(fileNamePtr);
  303.   RETURN errVal;
  304. END ParseQT;
  305. (* \\\ ------------------------------------------------------------------------- *)
  306.  
  307. (* /// ---------------------- "PROCEDURE HandleFileReq()" ---------------------- *)
  308. PROCEDURE HandleFileReq();
  309. BEGIN
  310.   IF asl.base=NIL THEN
  311.     d.PrintF("CyberQT needs asl.library V37+\n");
  312.   ELSE
  313.     fileReq:=asl.AllocAslRequestTags(asl.fileRequest,asl.initialPattern,y.ADR("#?.(mov|qt)(%|.rsrc|.rs)"),
  314.                                                      asl.doPatterns,e.true,
  315.                                                      asl.doMultiSelect,e.true,
  316.                                                      asl.titleText,y.ADR("Please select animation"),
  317.                                                      u.done);
  318.     IF fileReq#NIL THEN
  319.       WHILE asl.AslRequestTags(fileReq,u.done) DO
  320.         IF as.DoAllFiles(fileReq,ParseQT) THEN END;
  321.       END;
  322.       asl.FreeAslRequest(fileReq);
  323.       fileReq:=NIL;
  324.     END;
  325.   END;
  326. END HandleFileReq;
  327. (* \\\ ------------------------------------------------------------------------- *)
  328.  
  329. (* /// ---------------------- "PROCEDURE HandleWBStart()" ---------------------- *)
  330. PROCEDURE HandleWBStart();
  331.  
  332. VAR     icon: wb.DiskObjectPtr;
  333.         wbs: wb.WBStartupPtr;
  334.         name: e.STRING;
  335.         cnt: LONGINT;
  336.         anchor: d.AnchorPathPtr;
  337.         oldCD: d.FileLockPtr;
  338.         err: LONGINT;
  339.         multi: BOOLEAN;
  340.  
  341. BEGIN
  342.   wbs:=ol.wbenchMsg;
  343.   IF wbs.numArgs=1 THEN (* ja, dann Optionen vom CyberQT-Icon *)
  344.     y.SETREG(0,d.NameFromLock(wbs.argList[0].lock,name,SIZE(name)));
  345.     y.SETREG(0,d.AddPart(name,wbs.argList[0].name^,SIZE(name)));
  346.     icon:=ic.GetDiskObject(name);
  347.     IF icon#NIL THEN
  348.       o.GetIconOpts(icon);
  349.       ic.FreeDiskObject(icon);
  350.     ELSE
  351.       o.GetStdOpts();
  352.     END;
  353.     HandleFileReq();
  354.   ELSE
  355.     anchor:=e.AllocVec(SIZE(anchor^)+SIZE(e.STRING),e.any+LONGSET{e.memClear});
  356.     IF anchor#NIL THEN
  357.       anchor.strLen:=SIZE(e.STRING);
  358.       cnt:=1;
  359.       err:=0;
  360.       multi:=(wbs.numArgs>2);
  361.       REPEAT
  362.         oldCD:=d.CurrentDir(wbs.argList[cnt].lock);
  363.         IF wbs.argList[cnt].name^#"" THEN (* keine Verzeichnisse *)
  364.           IF d.MatchFirst(wbs.argList[cnt].name^,anchor^)=0 THEN
  365.             icon:=ic.GetDiskObject(anchor.info.fileName);
  366.             IF icon#NIL THEN
  367.               o.GetIconOpts(icon);
  368.               ic.FreeDiskObject(icon);
  369.             ELSE
  370.               o.GetStdOpts();
  371.             END;
  372.             err:=ParseQT(anchor,multi);
  373.             IF err#0 THEN y.SETREG(0,d.PrintFault(err,NIL)); END;
  374.           END;
  375.           d.MatchEnd(anchor^);
  376.         END;
  377.         y.SETREG(0,d.CurrentDir(oldCD));
  378.         INC(cnt);
  379.       UNTIL (cnt=wbs.numArgs) OR (err#0);
  380.       e.FreeVec(anchor);
  381.     END;
  382.   END;
  383. END HandleWBStart;
  384. (* \\\ ------------------------------------------------------------------------- *)
  385.  
  386. (* /// -------------------- "PROCEDURE HandleShellStart()" --------------------- *)
  387. PROCEDURE HandleShellStart();
  388.  
  389. VAR     files: d.ArgStringArray;
  390.  
  391. BEGIN
  392.   files:=o.GetShellOpts(template);
  393.   IF files#NIL THEN
  394.     IF ds.DoAllFiles(files,FALSE,ParseQT) THEN END;
  395.   ELSE
  396.     HandleFileReq();
  397.   END;
  398. END HandleShellStart;
  399. (* \\\ ------------------------------------------------------------------------- *)
  400.  
  401. BEGIN
  402. (*
  403. (* /// "$IF BETA" *)
  404.   expire:=d.Date(expireDate,0,0);
  405.   d.DateStamp(now);
  406.   IF d.CompareDates(expire,now)>0 THEN
  407.     d.PrintF("This beta has expired! Please contact me to get a more recent one.\n");
  408.     HALT(0);
  409.   END;
  410. (* \\\ $END *)
  411. *)
  412.   cu.CheckVersions(version);
  413.   IF ol.wbStarted THEN
  414.     HandleWBStart();
  415.   ELSE
  416.     HandleShellStart();
  417.   END;
  418. (* /// "$IF RUNDEBUG" *)
  419.   IF o.debug THEN d.PrintF("normal exit\n"); END;
  420. (* \\\ $END *)
  421. CLOSE
  422.   IF fileReq#NIL THEN asl.FreeAslRequest(fileReq); END;
  423. END CyberQT.
  424.  
  425.